package com.tangruojie.config;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

/**
 * 方法名	                    功能说明
 * sqlSessionFactory()	        创建并配置 SqlSessionFactoryBean，连接数据库并管理会话工厂
 * mapperScannerConfigurer()	指定包路径扫描 MyBatis 的 Mapper 接口，并自动生成代理注入 Spring 容器
 */
public class MybatisConfig {

    /**
     * 声明一个 SqlSessionFactoryBean 类型的 Spring Bean，名字为 sqlSessionFactory。
     * 参数 DataSource dataSource 表示 Spring 会自动注入你配置好的数据源（例如 Druid）。
     *
     * @param dataSource
     * @return
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
        /**
         * 创建 SqlSessionFactoryBean 实例，它是 Spring 提供的对 MyBatis 原生 SqlSessionFactory 的封装，用于生成 SqlSession 工厂对象，这个工厂可以生成和数据库交互的 SqlSession。
         */
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        /**
         * 设置 别名包路径：com.tangruojie.domain 中的类会被注册为 MyBatis 的类型别名。
         * 举例：若你有类 User，就可以在 mapper XML 中直接写 <resultMap type="User"> 而不是全限定名。
         */
        sqlSessionFactoryBean.setTypeAliasesPackage("com.tangruojie.domain");
        /**
         * 设置 MyBatis 使用的数据源，通常是你通过 DruidDataSource 或其他 DataSource Bean 配置的。
         */
        sqlSessionFactoryBean.setDataSource(dataSource);
        /**
         * 返回这个 Bean，让 Spring 容器托管。
         */
        return sqlSessionFactoryBean;
    }

    /**
     * 声明一个 MapperScannerConfigurer 类型的 Bean，用于扫描接口并将其自动注册为 Mapper Bean。
     *
     * @return
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        /**
         * 创建 Mapper 扫描器实例，它的作用是：
         * 自动扫描指定包下的接口（Mapper），并为它们创建代理对象，注入到 Spring 容器中。
         */
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        /**
         * 设置 Mapper 接口所在的包路径。
         * 例如：com.tangruojie.dao.UserMapper，Spring 会自动为其生成代理，并注入到其他类中。
         */
        mapperScannerConfigurer.setBasePackage("com.tangruojie.dao");
        /**
         * 将配置器返回给 Spring 容器。
         */
        return mapperScannerConfigurer;
    }

}
/**
 * ✅ sqlSessionFactory() 方法的准确作用：
 * 作用一：配置 数据源（DataSource），告诉 MyBatis 从哪个数据库获取连接。
 * 作用二：配置 别名包路径（TypeAlias），方便在 mapper XML 或注解中使用类的简单类名（如 User 而不是 com.xxx.User）。
 * 作用三：通过 Spring 提供的 SqlSessionFactoryBean，创建出 MyBatis 的核心对象 SqlSessionFactory，用于后续生成 SqlSession（数据库操作的入口）并与数据库交互。
 * ✅ mapperScannerConfigurer() 方法的准确作用：
 * 作用：扫描指定包下的 Mapper 接口（例如 UserMapper），并自动为每个接口生成一个代理实现类，注册到 Spring 容器中，成为可自动注入的 Bean。
 */
